UTM Tracking System
What We Capture
UTM parameters from URLs plus referer header:
utm_source,utm_medium,utm_campaign,utm_term,utm_contentreferer_urlfrom HTTP Referer header
When We Capture
- Session Storage: UTMs stored in server session (primary method) when user arrives with UTM parameters
- Cookie Backup: UTMs also stored in browser cookie for 7 days as fallback
- Database Storage: UTMs saved to database during:
- Order creation →
subscription_initorretail_initevent - User registration →
registerevent
- Order creation →
Important: Capture happens at order creation, NOT payment completion (prevents data loss during external payment gateway redirects).
Data Storage
UTMs are stored using a session-first approach with cookie fallback:
- Primary: Server-side session storage (works in all browsers including Instagram)
- Backup: Browser cookies (7-day duration)
- Database: Final storage when orders are created or users register
Analysis Queries
Conversion by Source
SELECT
utm_source,
COUNT(*) as orders_created,
SUM(CASE WHEN orders.status = 'approved' THEN 1 ELSE 0 END) as approved,
ROUND((SUM(CASE WHEN orders.status = 'approved' THEN 1 ELSE 0 END) * 100.0 / COUNT(*)), 2) as conversion_rate
FROM utms
JOIN orders ON utms.order_id = orders.id
WHERE utms.event IN ('subscription_init', 'retail_init')
AND utms.tenant_id = :tenant_id
GROUP BY utm_source
ORDER BY orders_created DESC;
Revenue by Campaign
SELECT
utm_campaign,
orders.currency,
COUNT(*) as orders,
SUM(orders.amount) as total_revenue,
AVG(orders.amount) as avg_order_value
FROM utms
JOIN orders ON utms.order_id = orders.id
WHERE orders.status = 'approved'
AND utms.event IN ('subscription_init', 'retail_init')
AND utms.tenant_id = :tenant_id
GROUP BY utm_campaign, orders.currency
ORDER BY total_revenue DESC;
Event Types
subscription_init: Recurring subscription order createdretail_init: One-time purchase order createdregister: New user registration
Key Features
- Universal compatibility: Works in all browsers including Instagram in-app browser and Safari with privacy settings
- Attribution window: UTMs remain valid for 7 days to prevent incorrect attribution from old campaigns
- Automatic cleanup: Expired UTMs are automatically cleared
- No JavaScript required: Tracking works server-side without client dependencies